import argparse
import os
import pydicom
import numpy as np
import shutil
# 导入 pydicom 后，它会自动查找系统中已安装的图像处理插件 (handler)。
# 我们无需手动导入 openjphpy 或 pylibjpeg。

def decompress_dicom_file(input_path, output_path):
    """
    读取一个使用 JPEG 2000 压缩的 DICOM 文件，并将其解压后保存为新文件。
    该脚本会自动使用 pydicom 支持的任何已安装的 JPEG 2000 解码器。

    Args:
        input_path (str): 输入的压缩DICOM文件路径。
        output_path (str): 解压后文件的保存路径。
    """
    # 检查输入文件是否存在
    if not os.path.exists(input_path):
        print(f"错误：输入文件不存在 -> {input_path}")
        return

    print(f"正在读取DICOM文件: {input_path}")
    try:
        # 读取DICOM文件
        ds = pydicom.dcmread(input_path)
    except Exception as e:
        print(f"读取文件时发生错误: {e}")
        return

    # 检查文件的传输语法 (Transfer Syntax) 是否为 JPEG 2000
    transfer_syntax = ds.file_meta.TransferSyntaxUID
    print(f"检测到文件的传输语法UID: {transfer_syntax} ({transfer_syntax.name})")

    supported_j2k_syntaxes = [
        '1.2.840.10008.1.2.4.90',  # JPEG 2000 Image Compression (Lossless Only)
        '1.2.840.10008.1.2.4.91',  # JPEG 2000 Image Compression
    ]

    if transfer_syntax not in supported_j2k_syntaxes:
        print("该文件不是使用支持的 JPEG 2000 格式压缩的，无需解压。")
        shutil.copy(input_path, output_path)
        return

    try:
        print("文件为 JPEG 2000 压缩格式，正在进行解压...")
        
        # pydicom 会自动查找并使用系统中已安装的兼容解码器
        # (例如 pylibjpeg-openjpeg 或 openjphpy)
        ds.decompress()
        
        # 解压后，pydicom 会自动更新 TransferSyntaxUID 为一个未压缩的格式,
        # 例如 '1.2.840.10008.1.2.1' (Explicit VR Little Endian)
        print("解压成功！")
        print(f"新的传输语法UID: {ds.file_meta.TransferSyntaxUID} ({ds.file_meta.TransferSyntaxUID.name})")

    except Exception as e:
        print(f"解压过程中发生严重错误: {e}")
        print("\n要处理 JPEG 2000 压缩的 DICOM 文件，您需要安装一个兼容的解码库。")
        print("请尝试安装以下库中的一个：")
        print("  - 推荐： pip install pylibjpeg pylibjpeg-openjpeg")
        print("  - 备选： pip install openjphpy")
        print("请确保 pydicom 和 numpy 也已安装： pip install pydicom numpy")
        return
        
    try:
        print(f"正在保存解压后的文件到: {output_path}")
        # 保存解压后的DICOM数据集
        # write_like_original=False 确保文件头中的 TransferSyntaxUID 被正确更新
        ds.save_as(output_path, write_like_original=False)
        print("文件保存成功！")
    except Exception as e:
        print(f"保存文件时发生错误: {e}")

if __name__ == '__main__':
    # 设置命令行参数解析器
    parser = argparse.ArgumentParser(
        description="解压使用 JPEG 2000 压缩的 DICOM 文件。",
        formatter_class=argparse.RawTextHelpFormatter,
        epilog="""
使用前，请确保您已安装了一个JPEG 2000解码器，例如：
  pip install pydicom numpy pylibjpeg pylibjpeg-openjpeg

使用示例:
  python decompress_dicom.py path/to/compressed.dcm path/to/decompressed.dcm
"""
    )
    parser.add_argument("-f","--input_file", help="输入的压缩DICOM文件路径。",required=False)
    parser.add_argument("-i","--input_dir", help="解压后的DICOM文件的保存路径。",required=False)
    parser.add_argument("-o","--output_dir", help="解压后的DICOM文件的保存路径。",required=True)


    args = parser.parse_args()

    output_dir = args.output_dir
    if args.input_file:
        output_file_name = os.path.basename(args.input_file).replace(".dcm", "_decompressed.dcm")
        output_file_path = os.path.join(output_dir, output_file_name)
        # 执行解压
        decompress_dicom_file(args.input_file, output_file_path) 
    elif args.input_dir:
        for file in os.listdir(args.input_dir):
            if file.endswith(".dcm"):
                output_file_name = os.path.basename(file).replace(".dcm", "_decompressed.dcm")
                output_file_path = os.path.join(output_dir, output_file_name)
                decompress_dicom_file(os.path.join(args.input_dir, file), output_file_path) 
    else:
        print("请输入输入的压缩DICOM文件路径或输入的压缩DICOM文件夹路径")